package StackPractice;

import java.util.Arrays;
import java.util.EmptyStackException;

/**
 * 自己实现Stack的模拟
 */
public class MyStack {
    public int usedSize;//栈中有效数据的个数
    public int[] elem;//栈的底层是用数组来实现的
    public static final int DEFAULT_SIZE = 10;

    public MyStack() {
        this.elem = new int[DEFAULT_SIZE];
    }

    /**
     * 压栈
     * @param val
     * @return
     */
    public int push(int val){
        if(isFull()) // isFull() : 栈满了
        {
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[usedSize] = val;
        usedSize++;
        return val;
    }
    /**
     * 判断栈是否满了，满了就要扩容。
     */
    private boolean isFull(){
        return this.elem.length == usedSize;
    }
    /**
     * 出栈
     */
    public int pop(){
        if(empty()) //empty()的返回值如果为true,则进入if的{}内。执行其中的语句.
        {
            throw new MyEmptyStackException("栈为空!");
        }
        return this.elem[--usedSize];
    }
    /**
     * 出栈要判断栈是否为空，为空则不能成功出栈了。因为栈内都没有元素了。
     */
    private  boolean empty(){
        return usedSize == 0;
    }
    /**
     * 查看栈顶的第一个元素,只是查看一眼，但不对其做任何操作，所以usedSize是不变的。
     */
    public int peek(){
        if (empty()){
            throw new MyEmptyStackException("栈为空，栈内无元素!");
        }
        return this.elem[usedSize-1];
    }
}